home *** CD-ROM | disk | FTP | other *** search
/ Chip 2000 February / OpenLinux 2.3 CD.iso / live / lizard / extrabin / instpkg.sh < prev    next >
Encoding:
Linux/UNIX/POSIX Shell Script  |  1999-08-15  |  10.9 KB  |  471 lines

  1. #!/bin/bash
  2. # $Id: instpkg.sh,v 1.36 1999/08/05 16:04:49 ray Exp $
  3.  
  4. Source=/mnt/install/col
  5. SourceP=$Source/install/RPMS
  6. SourceD=$Source/data
  7.  
  8. Target=/mnt/root
  9. #LOG=/dev/tty7
  10. LOG=$Target/var/adm/LST/debug/instpkg
  11. AddFile=/tmp/instpkg.add
  12. SkipFile=/tmp/instpkg.skip
  13. ProbFile=/tmp/instpkg.trouble
  14.  
  15. InstFlags="--nodeps --noscripts --notriggers --noorder --force"
  16.  
  17. Interactive=true
  18.  
  19. HaveWC=false
  20. # implemented modes are: InstBulk, InstSingle, InstCopySingle, InstCopyRSingle
  21. # currently not implemented: InstCopyBulk, InstCopyChunksSingle
  22. SlowMode=InstCopyRSingle
  23. FastMode=InstSingle
  24. DebugDF=true
  25. #DebugDF='eval df | fgrep $Target'
  26. CacheD=$Target/usr/InstCache
  27. FiddleOpt=false
  28. #Nice="nice -n 19"
  29. RetryDelay=15
  30.  
  31. nl="
  32. "
  33.  
  34. # global variables
  35. list=""
  36. List=""
  37.  
  38. false() { return 1; }
  39. true() { return 0; }
  40. PushD() { pushd "$@" > /dev/null; }
  41. PopD() { popd "$@" > /dev/null; }
  42.  
  43. rmdir() {
  44.   local d
  45.  
  46.   if [ -x /bin/rmdir ]; then
  47.     /bin/rmdir "$@"
  48.   else
  49.     for d in "$@"; do
  50.       perl -e 'rmdir("'$d'") || print STDERR "rmdir: '$d': $!\n"'
  51.     done
  52.   fi
  53. }
  54.  
  55. RunningOnFastMachine() {
  56.   if ! $Interactive
  57.   #  or RAM >= 64MB
  58.   #     and $Source on (   ( SCSI-CD && speed >= 12 )
  59.   #                    or ( ATAPI-CD && speed >= 32 )
  60.   #                    or ( network (&& speed >= 100Mbit)? )? )
  61.   #
  62.   then
  63.     return 0
  64.   else
  65.     return 1
  66.   fi
  67. }
  68.  
  69. LoadLimitter() {
  70.   local limit=$1; shift
  71.   local delay=$1; shift
  72.   local a1 a5 a10 b c
  73.   read a1 a5 a10 b c < /proc/loadavg
  74.   [ $[${a1%.*} + 1]${a1#*.} -ge $[$limit + 100] ] && {
  75.     echo "+++ load $a1 $a5 $a10"
  76.     sleep $delay
  77.   }
  78. }
  79.  
  80. InstFramework() {
  81.   local f
  82.   local d
  83.  
  84.   PushD $Target
  85.   ls -lR > /tmp/instpkg-lR
  86.   echo "Installing framework.cgz"
  87.   echo "Installing framework.cgz" 1>&3
  88.   zcat $SourceD/framework.cgz | cpio -idmu || exit 1
  89.   for d in opt/{bin,man}; do
  90.     [ -d $d ] || mkdir -p $d
  91.   done
  92.   for f in passwd shadow group hosts sysconfig/network; do
  93.     [ ! -r etc/$f -a -r etc/$f- ] && mv etc/$f- etc/$f
  94.   done
  95.   rm -vf etc/*- etc/sysconfig/*-
  96.   mv /tmp/instpkg-lR var/adm/LST/debug/
  97.  
  98.   # Try to fix '/opt'
  99.   $FiddleOpt && (
  100.     set -x
  101.     # /opt is not mount-point
  102.     fgrep -v " $Target/opt" /proc/mounts > /dev/null &&
  103.     # also no sym-link
  104.     [ ! -L $Target/opt ] &&
  105.     # we have a separate /usr
  106.     fgrep " $Target/usr" /proc/mounts > /dev/null &&
  107.     # small '/'  (FIXME: how should I check?)
  108.     true &&
  109.     #  => copy & remove & make sym-link
  110.     cp -a $Target/opt $Target/usr/opt &&
  111.     rm -rf $Target/opt &&
  112.     ln -s usr/opt $Target/opt
  113.   )
  114.   PopD
  115. }
  116.  
  117. InstBulk() {
  118.   local errCount=0
  119.  
  120.   echo "*** $(date): installing $count packages (bulk mode)"
  121.   echo $count 1>&3
  122.   InstFramework
  123.  
  124.   PushD $SourceP
  125.   $Nice rpm -iv $InstFlags --root $Target $List 1>&3 || {
  126.     errCount=$[ $errCount + 1];
  127.     echo "Error installing at least one package! Trying to continue..." 1>&2
  128.   }
  129.   PopD
  130.   return $errCount
  131. }
  132.     
  133. InstSingle() {
  134.   local errCount=0
  135.   local p
  136.   local retry=""
  137.  
  138.   echo "*** $(date): installing $count packages (single action)"
  139.   echo $count 1>&3
  140.   $DebugDF
  141.   InstFramework
  142.  
  143.   PushD $SourceP
  144.   for p in $List; do
  145.     echo "Installing '$p'"
  146.     $Nice rpm -iv $InstFlags --root $Target $p 1>&3 || {
  147.       retry="$retry $p"
  148.       errCount=$[ $errCount + 1]
  149.       echo "1: $p" >> $ProbFile
  150.       echo "Error installing '$p'!  Will try again later..." 1>&2
  151.     }
  152.     $DebugDF
  153.   done
  154.   PopD
  155.   [ $errCount != 0 ] || return 0
  156.   # else: try harder!
  157.   echo "*** $(date): package installation encountered $errCount problems..."
  158.   PushD $SourceP
  159.   errCount=0
  160.   for p in $retry; do
  161.     echo "Retry installation of '$p'"
  162.     sleep $RetryDelay
  163.     $Nice rpm -iv $InstFlags --root $Target $p 1>&3 || {
  164.       errCount=$[ $errCount + 1]
  165.       echo "2: $p" >> $ProbFile
  166.       echo "Error installing '$p' (2nd try)!  Trying to continue..." 1>&2
  167.       echo "Error installing '$p'!  Trying to continue..." 1>&3
  168.     }
  169.     $DebugDF
  170.   done
  171.   PopD
  172.   return $errCount
  173. }
  174.  
  175. InstCopySingle() {
  176.   local errCount=0
  177.   local p
  178.   local cnt=$count
  179.   local retry=""
  180.  
  181.   count=$[($count - 1) * 2 + 1]
  182.   echo "*** $(date): installing $count packages (copy-then-single)"
  183.   echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH"
  184.   echo "PATH=$PATH"
  185.   $DebugDF
  186.  
  187.   echo $count 1>&3
  188.   InstFramework
  189.  
  190.   echo "*** $(date): Copying $cnt packages (COPY-then-single)"
  191.   $DebugDF
  192.   mkdir -p $CacheD
  193.   PushD $CacheD
  194.   for p in $List; do
  195.     LoadLimitter 110 5
  196.     echo "Copying '$p'"
  197.     cp -v $SourceP/$p . 1>&3 || {
  198.       echo "C: $p" >> $ProbFile
  199.       echo "Error copying '$p'!  Trying to continue..." 1>&2
  200.       sleep $RetryDelay
  201.     }
  202.   done
  203.   $DebugDF
  204.  
  205.   echo "*** $(date): installing $cnt packages (copy-then-SINGLE)"
  206.   for p in $List; do
  207.     [ -r $p ] || {
  208.       retry="$retry $p"
  209.       errCount=$[ $errCount + 1]
  210.       echo "F: $p" >> $ProbFile
  211.       echo "Installing '$p' delayed due to copy-error!" 1>&2
  212.       continue
  213.     }
  214.     LoadLimitter 150 3
  215.     echo "Installing '$p'"
  216.     $Nice rpm -iv $InstFlags --root $Target $p 1>&3 || {
  217.       retry="$retry $p"
  218.       errCount=$[ $errCount + 1]
  219.       echo "1: $p" >> $ProbFile
  220.       echo "Error installing '$p'!  Will try again later..." 1>&2
  221.     }
  222.     rm -f $p
  223.     $DebugDF
  224.   done
  225.   PopD
  226.   rmdir $CacheD
  227.   [ $errCount != 0 ] || return 0
  228.   # else: try harder!
  229.   echo "*** $(date): package installation encountered $errCount problems..."
  230.   PushD $SourceP
  231.   errCount=0
  232.   for p in $retry; do
  233.     echo "Retry installing '$p'"
  234.     sleep $RetryDelay
  235.     $Nice rpm -iv $InstFlags --root $Target $p 1>&3 || {
  236.       errCount=$[ $errCount + 1]
  237.       echo "2: $p" >> $ProbFile
  238.       echo "Error installing '$p' (2nd try)!  Trying to continue..." 1>&2
  239.       echo "Error installing '$p'!  Trying to continue..." 1>&3
  240.     }
  241.     $DebugDF
  242.   done
  243.   PopD
  244.   return $errCount
  245. }
  246.  
  247. InstCopyRSingle() {
  248.   local errCount=0
  249.   local llpB=$LD_LIBRARY_PATH
  250.   local llp=""
  251.   local pB=$PATH
  252.   local o
  253.   
  254.   echo "*** $(date): preparing run-time optimized InstCopySingle()"
  255.   $DebugDF
  256.   mkdir -p $CacheD/{bin,lib}
  257.   for o in /bin/{rpm,bash,cpio} /sbin/chroot /usr/bin/{perl,nice}; do
  258.     LoadLimitter 110 3
  259.     cp -p $o $CacheD/bin
  260.   done
  261.   for o in $(ls {,/usr}/lib/l*.so* | sed -e '/qt\|stdc\|libc.so.6/d'); do
  262.     LoadLimitter 110 3
  263.     cp -p $o $CacheD/lib
  264.   done
  265.   ln -sf libc-2.*.so $CacheD/lib/libc.so.6
  266.   $DebugDF
  267.  
  268.   [ -n "$llpB" ] && llp=:$llpB
  269.   export LD_LIBRARY_PATH=$CacheD/lib$llp; PATH=$CacheD/bin:$PATH
  270.   InstCopySingle
  271.   errCount=$?
  272.   LD_LIBRARY_PATH=$llpB; [ -z "$llpB" ] && unset LD_LIBRARY_PATH; PATH=$pB
  273.  
  274.   rm -rf $CacheD/{bin,lib}
  275.   rmdir $CacheD
  276.   $DebugDF
  277.   return $errCount
  278. }
  279.  
  280. ExpandList() {
  281.   local m=$1; shift;    # either 'full' or 'NVR'
  282.   local d=$1; shift
  283.  
  284.   perl -e '
  285.     $d = "'$d'"; $mode = "'$m'"; $e="noarch|i386|ppc|alpha|sparc";
  286.     open(IN, "ls $d |") || die;
  287.     while ( <IN> ) {
  288.       chop;
  289.       if ( /^((.*)-([^-]+)-([^-]+))\.($e)\.rpm$/o ) {
  290.         $Full{$2} = $Full{$1} = $_;
  291.         $NVR{$2} = $1;
  292.     $Arch{$2} = $5;
  293.       }
  294.     }
  295.     close(IN);
  296.     while ( <> ) {
  297.       chop;
  298.       $_ = (exists( $Full{$_})) ? $Full{$_} . "\n" : ""
  299.     if ( $mode eq "full" );
  300.       $_ = ((exists($NVR{$_})) ? $NVR{$_} : $_) . "\n"
  301.         if ( $mode eq "NVR" );
  302.       next if ( exists( $O{$_}) );
  303.       $O{$_} = 1;
  304.       print "$_" if ( $_ );
  305.     }
  306.   ' "$@"
  307. }
  308.  
  309. Main() {
  310.   local sel
  311.   local count
  312.   local errCount=0
  313.  
  314.   echo "*** $(date): instpkgs $1"
  315.  
  316.   case "$1" in
  317.    /*)
  318.     # non-Interactive mode...
  319.     Interactive=false
  320.     sel="$1"
  321.     [ -r "$sel" ] || {
  322.       echo "instpkg: '$sel' not readable! Bailing out..." 1>&2
  323.       exit 1
  324.     }
  325.     ;;
  326.    all|"")
  327.     sel=all
  328.     ;;
  329.    *)
  330.     sel="$1"
  331.     ;;
  332.   esac
  333.  
  334.   if ! $Interactive; then
  335.     # some magic incantations to expand name to name-version-release...
  336.     echo "*** $(date): expanding $sel list..."
  337.     list=$(ExpandList NVR $SourceP $sel)
  338.   elif [ -r $SourceD/pkgs-$sel ]; then
  339.     list=$(cat $SourceD/pkgs-$sel)
  340.   elif [ -r $SourceD/pkgs-$sel.generic ]; then
  341.     # some magic incantations to expand name to name-version-release...
  342.     echo "*** $(date): expanding $sel-generic list..."
  343.     list=$(ExpandList NVR $SourceP $SourceD/pkgs-$sel.generic)
  344.   elif [ "$sel" = "all" ]; then
  345.     echo "*** $(date): creating 'pkgs-all' on-the-fly..."
  346.     list=$(ls $SourceP | sed -n 's/\.[^.][^.]*\.rpm$//p')
  347.   else
  348.     echo "instpkg: cannot evaluate package list" 1>&3
  349.     exit 1
  350.   fi
  351.   [ "$sel" != "all" ] &&  # requested by Ralf
  352.   [ -z "$(fgrep pcmcia_core /proc/modules)" ] && {
  353.     echo "*** $(date): apparently no laptop => omitting 'pcmcia-cs'..."
  354.     echo "pcmcia-cs" >> $SkipFile
  355.   }
  356.   [ -f "$SkipFile" ] && {
  357.     echo "*** $(date): removing '$SkipFile' from list..."
  358.     ExpandList NVR $SourceP $SkipFile > $SkipFile.expanded
  359.     list=$(echo "$list" | fgrep -v -f $SkipFile.expanded)
  360.   }
  361.   [ -f "$AddFile" ] && {
  362.     echo "*** $(date): adding '$AddFile' to list..."
  363.     list="$list$nl$(ExpandList NVR $SourceP $AddFile)"
  364.   }
  365.   List=$(echo "$list" | ExpandList full $SourceP -)
  366.  
  367.   count=1
  368.   for p in $list; do
  369.     count=$[ $count + 1 ]
  370.   done
  371.  
  372.   # now install with preselected method...
  373.   if RunningOnFastMachine; then
  374.     $FastMode
  375.   else
  376.     $SlowMode
  377.   fi
  378.   errCount=$?
  379.   if [ $errCount != 0 ]; then
  380.     echo "*** $(date): packages installed, BUT $errCount problems..."
  381.   else
  382.     echo "*** $(date): packages installed (no problems)..."
  383.   fi
  384.  
  385.   echo "*** $(date): prepareing post-install scripts"
  386.   echo "* post *" 1>&3
  387.   count=2
  388.   PushD $Target/var/adm/LST/PostIn || exit 1
  389.   for p in $list; do
  390.     rpm --PostIn --root $Target $p |
  391.       sed -e '/^\/sbin\/ldconfig$/d' -e '/^\/bin\/sh$/d' > $p
  392.     [ -s $p -a "$(cat $p)" != "$(echo '#! /bin/sh')" ] || {
  393.       rm -f $p
  394.       continue
  395.     }
  396.     chmod 755 $p
  397.     case "$p" in
  398.      man-[0-9]*|teTeX-[0-9]*)
  399.       mv $p ../Unconfigured/$p.todo
  400.       continue
  401.       ;;
  402.     esac
  403.     count=$[ $count + 1 ]
  404.   done
  405.   list=$(ls)
  406.   PopD
  407.  
  408.   echo "*** $(date): about to run $count scripts"
  409.   echo $count 1>&3
  410.  
  411.   mount -t proc Target $Target/proc
  412.   PushD $Target
  413.   echo "Running 1st ldconfig"
  414.   echo "Installing ldconfig-a post" 1>&3
  415.   chroot $Target /sbin/ldconfig
  416.   for p in $list; do
  417.     echo "%PostIn '$p'"
  418.     echo "Installing $p post" 1>&3
  419.     chroot $Target /var/adm/LST/PostIn/$p
  420.   done
  421.   echo "Running 2nd ldconfig"
  422.   echo "Installing ldconfig-b post" 1>&3
  423.   chroot $Target /sbin/ldconfig
  424.   umount $Target/proc
  425.   PopD
  426.   echo "*** $(date): %PostIn done"
  427.  
  428.   echo "*** $(date): misc fixup"
  429.   set -x
  430.   PushD $Target
  431.   # hack for booter
  432.   false && {
  433.     [ -e dev/ttyNULL ] || mv dev/tty0 dev/ttyNULL
  434.     [ -e dev/tty0 ] ||    ln -s tty1 dev/tty0
  435.   }
  436.  
  437.   # fix for linux-kernel/rc.modules
  438.   chroot $Target sbin/depmod -a
  439.  
  440.   # fixes for LISA
  441.   [ -d initrd ] || mkdir -p initrd
  442.   [ -d usr/lib/LST ] ||  mkdir -p usr/lib/LST
  443.   [ -f /IDENTIFY ] &&
  444.     cp -a /IDENTIFY usr/lib/LST/IDENTIFY.root
  445.   [ -f /floppy/IDENTIFY ] &&
  446.     cp -a /floppy/IDENTIFY usr/lib/LST/IDENTIFY.boot
  447.   echo "$(uname -a)" > usr/lib/LST/IDENTIFY.kernel
  448.  
  449.   # fix for COAS
  450.   [ ! -r usr/lib/LST/col.master -a -r $SourceD/col.master ] &&
  451.     cp -a $SourceD/col.master usr/lib/LST
  452.   
  453.   PopD
  454.   set +x
  455.   echo "* done *" 1>&3
  456.   echo "*** $(date): FINISHED"
  457.  
  458.   return $errCount
  459. }
  460.  
  461. mkdir -p ${LOG%/*}
  462. exec - 3>&1 1>>$LOG 2>&1
  463. Main "$@"
  464. exit $?
  465.  
  466. # Local Variables:
  467. # mode: sh
  468. # sh-indentation: 2
  469. # End:
  470.  
  471.